home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / prev / prev.lha / macro.h < prev    next >
Text File  |  1991-01-29  |  5KB  |  266 lines

  1.  
  2. /*
  3.  * macros for processing vectors
  4.  */
  5.  
  6. /*
  7.  * dprod
  8.  *
  9.  *    returns the dot product of a and b.
  10.  */
  11. #define    dprod(a, b)    ((a).x * (b).x + (a).y * (b).y + (a).z * (b).z)
  12.  
  13. /*
  14.  * xprod
  15.  *
  16.  *    returns the vector cross product of b and c in a
  17.  */
  18. #define xprod(a, b, c) { \
  19.     (a).x = (b).y * (c).z - (b).z * (c).y; \
  20.     (a).y = (b).z * (c).x - (b).x * (c).z; \
  21.     (a).z = (b).x * (c).y - (b).y * (c).x; \
  22. }
  23.  
  24. /*
  25.  * normalise
  26.  *
  27.  *    normalise vector a
  28.  */
  29. #define    normalise(a) {\
  30.     register float    _norm;\
  31. \
  32.     _norm = sqrt((double)dprod((a), (a)));\
  33.     (a).x /= _norm;\
  34.     (a).y /= _norm;\
  35.     (a).z /= _norm;\
  36. }
  37.  
  38. /*
  39.  * reverse
  40.  *
  41.  *    reverse the vector a
  42.  */
  43. #define reverse(a) {\
  44.     (a).x = -(a).x;\
  45.     (a).y = -(a).y;\
  46.     (a).z = -(a).z;\
  47. }
  48.  
  49. /*
  50.  * vsub
  51.  *
  52.  *    assign the subtraction of c from b to a
  53.  */
  54. #define vsub(a, b, c) {\
  55.     (a).x = (b).x - (c).x;\
  56.     (a).y = (b).y - (c).y;\
  57.     (a).z = (b).z - (c).z;\
  58. }
  59.  
  60. /*
  61.  * vadd
  62.  *
  63.  *    assign the addition of b and c into a
  64.  */
  65. #define vadd(a, b, c) {\
  66.     (a).x = (b).x + (c).x;\
  67.     (a).y = (b).y + (c).y;\
  68.     (a).z = (b).z + (c).z;\
  69. }
  70.  
  71. /*
  72.  * smult
  73.  *
  74.  *    scalar multiply vector a by b
  75.  */
  76. #define    smult(a, b) {\
  77.     (a).x *= (b);\
  78.     (a).y *= (b);\
  79.     (a).z *= (b);\
  80. }
  81.  
  82. /*
  83.  * vmmult
  84.  *
  85.  *    multiply a vector b by matrix m, putiing the result in a
  86.  *
  87.  */
  88. #define    vmmult(a, b, m) {\
  89.     (a).x = (b).x * m[0][0] + (b).y * m[1][0] + (b).z * m[2][0] + m[3][0]; \
  90.     (a).y = (b).x * m[0][1] + (b).y * m[1][1] + (b).z * m[2][1] + m[3][1]; \
  91.     (a).z = (b).x * m[0][2] + (b).y * m[1][2] + (b).z * m[2][2] + m[3][2]; \
  92. }
  93.  
  94. /*
  95.  * cp3x3
  96.  *
  97.  *    copy a 3 x 3 matrix out of b into a
  98.  */
  99. #define cp3x3(a, b) { \
  100.     a[0][0] = b[0][0]; a[0][1] = b[0][1]; a[0][2] = b[0][2]; \
  101.     a[1][0] = b[1][0]; a[1][1] = b[1][1]; a[1][2] = b[1][2]; \
  102.     a[2][0] = b[2][0]; a[2][1] = b[2][1]; a[2][2] = b[2][2]; \
  103. }
  104.  
  105. /*
  106.  * v3x3mult
  107.  *
  108.  *    multiply a vector b by matrix m, puting the result in a
  109.  *
  110.  */
  111. #define    v3x3mult(a, b, m) {\
  112.     (a).x = (b).x * m[0][0] + (b).y * m[1][0] + (b).z * m[2][0]; \
  113.     (a).y = (b).x * m[0][1] + (b).y * m[1][1] + (b).z * m[2][1]; \
  114.     (a).z = (b).x * m[0][2] + (b).y * m[1][2] + (b).z * m[2][2]; \
  115. }
  116.  
  117. /*
  118.  * v3x3tmult
  119.  *
  120.  *    multiply a vector b by the transpose of matrix m, puting the
  121.  * result in a
  122.  *
  123.  */
  124. #define    v3x3tmult(a, b, m) {\
  125.     (a).x = (b).x * m[0][0] + (b).y * m[0][1] + (b).z * m[0][2]; \
  126.     (a).y = (b).x * m[1][0] + (b).y * m[1][1] + (b).z * m[1][2]; \
  127.     (a).z = (b).x * m[2][0] + (b).y * m[2][1] + (b).z * m[2][2]; \
  128. }
  129.  
  130. /*
  131.  * macros from moving from ray to object space and visa versa
  132.  */
  133.  
  134. /*
  135.  * transray
  136.  *
  137.  *    calculate ray a which is ray b transformed into
  138.  * the object space of o.
  139.  */
  140. #define transray(o, a, b) {\
  141.         transdata       *_td;\
  142. \
  143.     _td = o->td; \
  144. \
  145.     v3x3mult((a).org, (b).org, _td->mat);\
  146.     v3x3mult((a).dir, (b).dir, _td->mat);\
  147. \
  148.     (a).org.x += _td->trans.x;\
  149.     (a).org.y += _td->trans.y;\
  150.     (a).org.z += _td->trans.z;\
  151. }
  152.  
  153. /*
  154.  * toobject
  155.  *
  156.  *    transform the point in world space b into object space 
  157.  * and save in a.
  158.  */
  159. #define    toobject(o, a, b) { \
  160.     transdata    *_td;\
  161. \
  162.     _td = o->td; \
  163. \
  164.     v3x3mult((a), (b), _td->mat); \
  165. \
  166.     (a).x += _td->trans.x; \
  167.     (a).y += _td->trans.y; \
  168.     (a).z += _td->trans.z; \
  169. }
  170.  
  171. /*
  172.  * totexture
  173.  *
  174.  *    transform the point in world space b into texture space 
  175.  * and save in a.
  176.  */
  177. #define    totexture(txt, a, b) { \
  178.     transdata    *_td; \
  179. \
  180.     _td = txt->td; \
  181. \
  182.     v3x3mult((a), (b), _td->mat); \
  183. \
  184.     (a).x += _td->trans.x; \
  185.     (a).y += _td->trans.y; \
  186.     (a).z += _td->trans.z; \
  187. \
  188.     (a).x *= _td->nscales.x; \
  189.     (a).y *= _td->nscales.y; \
  190.     (a).z *= _td->nscales.z; \
  191. }
  192.  
  193. /*
  194.  * toworld
  195.  *
  196.  *    transform the point in object space b into world space 
  197.  * and save in a.
  198.  */
  199. #define    toworld(o, a, b) { \
  200. \
  201.     if (o->mat != (mat3x3 *)NULL) { \
  202.         v3x3tmult((a), (b), (*o->mat)); \
  203.     } else \
  204.         a = b; \
  205. \
  206.     (a).x -= o->trans.x; \
  207.     (a).y -= o->trans.y; \
  208.     (a).z -= o->trans.z; \
  209. }
  210.  
  211. /*
  212.  * macros to handle allocation of hitlist entries
  213.  */
  214. #define release(p)    {\
  215.     p->nxt = fhlist;\
  216.     fhlist = p;\
  217. }
  218.  
  219. #define    fetch(p)    {\
  220.     if (fhlist != (hlist *)NULL) {\
  221.         p = fhlist;\
  222.         fhlist = fhlist->nxt;\
  223.     } else\
  224.         p = (hlist *)smalloc(sizeof(hlist));\
  225. }
  226.  
  227. /*
  228.  * macro for accessing random number table
  229.  */
  230. #define    randnum()    ((randp == erandp) ? *(randp = randtable) : *randp++)
  231.  
  232.  
  233. /*
  234.  * miscellaneous macros
  235.  */
  236. #define    sqr(x)    ((x) * (x))
  237.  
  238. /*
  239.  * set a or b depending on whether c is a minimum or maximum value
  240.  */
  241. #define    minmax(a, b, c)    {\
  242.     if ((a) > (c)) \
  243.         (a) = (c); \
  244.     else if ((b) < (c)) \
  245.         (b) = (c); \
  246. }
  247.  
  248. /*
  249.  * clamp a value to be between 0.0 and 1.0
  250.  */
  251. #define clamp(a)        ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
  252.  
  253. /*
  254.  * linearly blend two colors
  255.  */
  256. #define mix(col1, col2, fact) { \
  257.     (col1).r = fact * (col2).r + (1.0 - fact) * (col1).r;\
  258.     (col1).g = fact * (col2).g + (1.0 - fact) * (col1).g;\
  259.     (col1).b = fact * (col2).b + (1.0 - fact) * (col1).b;\
  260. }
  261.  
  262. /*
  263.  * linearly smooth one colour to another
  264.  */
  265. #define linsmooth(a, b, c)    (((c) < (a)) ? 0.0 : ((c) > (b)) ? 1.0 : ((c) - (a)) / ((b) - (a)))
  266.